package com.shengsiyuan.netty.firstexample;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
 * 测试服务器
 * 功能描述：基于netty，客户端发出请求，服务端返回一个hello world
 *
 * @author 荀彧 2021/1/5
 */
public class TestServer {
    private static final int PORT = 8080;

    public static void main(String[] args) throws Exception {
        // 定义两个事件循环组。
        // NioEventLoopGroup 可以理解为死循环。
        // bossGroup寓意不断从客户端接收连接，但是不对连接进行处理。交由workerGroup处理
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        // workerGroup 进行处理。
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {

            // ServerBootstrap 是 netty提供的比较方便启动的服务类
            ServerBootstrap serverBootstrap = new ServerBootstrap();

            serverBootstrap.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    // 子处理器，我们自己编写的，对请求进行处理
                    .childHandler(new TestServerInitializer());
            ChannelFuture channelFuture = serverBootstrap.bind(PORT).sync();
            channelFuture.channel().closeFuture().sync();
        }finally {
            // 出现异常之后，优雅关闭
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }

    }
}

